package xyz.jangle.thread.test.n2_2.synchonized;

import java.util.concurrent.TimeUnit;

/**
 * 
 *  同步方法，临界区同步的三种方式。
 *   从运行结果中可以看出，三种方式互不干扰，也说明他们不是互斥的，是不同的加锁方式。
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2021年1月28日 上午10:27:48
 * 
 */
public class M {
	
	private static final Object lock = new Object();

	public static void main(String[] args) {
		// 创建3个线程执行3个不同的方法。
		M m = new M();
		new Thread(() -> {
			m.test1();
		}).start();
		new Thread(() -> {
			M.test2();
		}).start();
		new Thread(() -> {
			m.test3();
		}).start();

	}

	/**
	 * 关联实例对象，即this，作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:34:36
	 */
	public synchronized void test1() {
		for (int i = 0; i < 10; i++) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("111111111111");
		}
	}

	/**
	 * 关联类对象，即Class对象，作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:36:49
	 */
	public static synchronized void test2() {
		for (int i = 0; i < 10; i++) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("2222222222222");
		}

	}

	/**
	 * 关联参数对象，即new Object(),作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:37:11
	 */
	public void test3() {
		synchronized (lock) {

			for (int i = 0; i < 10; i++) {
				try {
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("33333333333");
			}
		}
	}

}
